package com.qf.controller;

import com.qf.utils.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


/**
 * @author hanjiejie
 * @version V1.0
 * @Project java2203
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/5/20 22:40
 */
public class BaseServlet extends HttpServlet {
    /**
     * 所有的请求都会进入到这个方法中, 这个方法中通过反射机制来动态执行具体的业务方法
     * get请求, post请求, put请求, delete请求都会经过这个service方法
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 获取获取请求参数（标识符，方法名）
      String methodStr = req.getParameter(Constants.TAG);
        //2.如果methodStr没有获取到值就返回到首页
      if (methodStr==null || methodStr.equals("")){
          methodStr =Constants.INDEX;
      }
        //3.反射调用对应的业务逻辑方法
        //获取class类
        Class clazz = this.getClass();
        //4.从类中获取方法对象
        try {
            Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);

            //5.执行从类中获取到的方法对象，接受方法执行结果
            Object result = method.invoke(this, req, resp);
            //6根据返回的结果进行判断  ，返回值不为空
            if (result !=null){
                //把返回的结果强转成字符串类型
                //jump获取到的结果是 redirct: request.getContextPath()/admin/login.jsp
             String jump = (String) result;
                // 判断jump是以什么开头
                // startsWith() 方法用于检测字符串是否以指定的子字符串开始
                if (jump.startsWith(Constants.FORWARD)){
                    //判断结果是请求转发处理
                    //substring（）该方法是截取字符串的木一部分
                    //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                    //indexOf（）该方法是字符串开始位置
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);
                    //执行请求转发
                    req.getRequestDispatcher(path).forward(req,resp);
                }else if (jump.startsWith(Constants.REDIRECT)){
                    String path  = jump.substring(jump.indexOf(Constants.FLAG) + 1);
                    //执行重定向
                    resp.sendRedirect(path);
                }
                //9.判断如果是其他类型的返回值， 那么就流到浏览器
                resp.getWriter().println(jump);
                         }

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }
}